Patient Survival Prediction - Alejandro Martín

Este proyecto es parte del Trabajo de Fin de Máster de la Universidad Complutense de Madrid. El proyecto es llevar a cabo el análisis de un dataset el cual nos da información sobre el estado de salud de los pacientes que ingresan en distintos hospitales. Las variables prioritarias son datos médicos relativos a análisis realizados en su ingreso y variables de su historial médico que puedan ser fundamentales a la hora de analizar eln estado de salud de los pacientes. La variable primaria o target es la de "hospital_death", la cual nos indica si el apciente falleció durante la hospitalización o por el contrario sobrevivió.

El objetivo principal de este proyecto es mediante el Machine Learning realizar un modelo que pueda predecir, en base a los datos de los pacientes, si el paciente vivirá o fallecerá. La idea es que dicho modelo se pueda aplicar facilmente a los nuevos datos incorporados, dando de esta forma un soporte a los hospitales y profesionales sanitarios. Mediante esta predicción se podría ahorrar tiempo y dinero a la hora de cada intervención, como a su vez priorizar cada caso dependiendo del estado de cada paciente y la urgencia que se necesite. En tiempos donde hay pandemias mundiales, catástrofes naturales y cada vez más población que atender, este sistema podría dar un apoyo a los hospitales pudiendo salvar más vidas y racionando los medios tanto de mano de obra como de espacios tan escasos en nuestro día a día sanitario.

Cargar de los datasets, dejamos todas las variables en un único dataset para analizar

Análisis

Podemos observar que el conjunto de datos trata de 64199 filas y 86 columnas.

Un análisis que me parecia muy interesante y muy visual a primera vista. En este gráfico observamos en función de la edad y el problema médico por el que fue ingresado el paciente en el hospital. Se observan varios problemas médicos mortales con edades dispares. Por ejemplo, el trauma y el problema cardiovascular se aprecia con un indice de mortalidad más claro en pacientes de 20 a 40 años. Sin embargo, problemas hematológicos, gastrointestinales o respiratorios se aprecian a una mayor edad de más de 60 años.

Como el preprocesado lo queremos hacer conjuntamente más adelante, procedemos a añadir una columna que llamaremos 'tipo_dato' en ambos datasets para poder identificar y separar en su momento los datos de entrenamiento de los de test.

Nuestra variable target, como bien hemos explicado al inicio, será 'hospital_death', la cual es un booleano que nos dirá si el paciente ha fallecido en el hospital = True = 1 o, por el contrario ha sobrevivido = False = 0. Mediante la función loc extraemos el target de cada id del paciente del dataset de entrenamiento, contruyendo así el dataframe target.

df_target.shape

Cada paciente es único, como hemos podido comprobar, por lo tanto no habrá ningun problema con el target. Ahora, una vez visto el tamaño de los distintos dataset de entrenamiento, test y target uniremos los dos primeros para poder hacer un análisis descriptivo y un preprocesado correcto.

PREPROCESADO

Respecto a la variable de edad observamos que el grueso de datos, en el caso de comprobación, las 10 edades más representadas en el dataset, observamos que se encuentran en una edad <= 63 años. Esta variable es facilmente interpretable, debido a que el factor de la edad es muy identificativo con los problemas de salud y en consecuencia con el hecho natural del fallecimiento. Esta importancia relativa a esta variable nos hará dilucidar como tratar los nulos pertenecientes a la misma. Debido al peso natural de la variable edad, eliminaremos las filas nulas de dicha variable, descartando por ello, a los pacientes que no tienen una edad registrada.

Las variables de etnia y genero trataremos los nulos rellenando con un dato de otro o desconocido. En gcs_unable_apache buscaremos el valor más repetido que es 0.

Una vez después de haber limpiado el dataset de nulos tendremos que ver que tipo de variables nos encontramos, ya que habrá que convertir las categóricas a numéricas.

Como podemos observar no hay muchas variables categóricas, esto nos facilitará el cambio a numéricas. Podemos observar que no tenemos ninguna binaria (no booleanos), hay una que se podría convertir en variable dummie y transformarla de dicha forma, pero debido a que el tercer dato es ínfimo no valdrá la pena sacar 3 variables de dicha columna. Dicho esto, usaremos Label Encoder para tratar las categóricas.

Para el gráfico de correlación he decido usar las dos variables de probabilidad traidas del score de APACHE III, un puntuaje que será muy importante en este dataset. Las he utilizado como principal reclamo para encontrar correlaciones con la posible muerte de un paciente. Se puede ver a primera vista que "ventilated_apache" y "d1_heartrate_max" serán las que mayor correlación mantendrán con estas dos variables, las cuales serán las más potentes de todas ellas.

Ahora veremos los diferentes outliers que nos podremos encontrar en las distintas variables, los cuales intentaremos tratar para hacer un modelo más ajustado.

En este tratamiento de outliers he decidido tratar las siguientes variables: ['apache_3j_diagnosis', 'heart_rate_apache', 'h1_resprate_min', 'h1_spo2_max', 'h1_spo2_min'], el resto las he considerado porque aunque el valor estuviese lejos del grueso de datos no suponían un problema para el análisis, por ejemplo, los outliers de las variables edad, estatura y peso eran simplemente características de otro tipo de pacientes más diferente al rango común.

Una vez mergeado el dataset sacamos la correlación de variables, pudiendo apreciar el impacto que tienen sobre la muerte de un paciente en el hospital.

La correlación de las distintas variables con la variable target es muy esclarecedora. Podemos encontrar "apache_4a_hospital_death_prob" y "apache_4a_icu_death_prob" como las 2 más importantes. Son dos variables que vienen de una probabilidad dada por la variable APACHE III diagnósis, teniendo en cuenta las avriables ICU, que describen el tipo de problema de salud del paciente y que condiciones generales había. Por ejemplo: en que unidad hospitalaria ha sido admitido, si fue admitido de primeras o transferido a esa unidad, que tipo de cuidado se le ha podido dar en dicha unidad, etc

Modelado y entrenamiento

Una vez probado con diferentes modelos escogemos el que mejor se nos ajusta. De primeras el que nos muestra una mayor curva ROC es el modelo de árboles de decisión, escogeremos ese mismo debido que es al que mejor rendimiento nos da y el que mayor "calidad" ofrece. Ahora haremos la validación cruzada para asegurar que no hay overfitting.

Obtenemos 5 predicciones donde la desviación típica es tan baja que nos aclara que no está sobreajustado.

Entrenamiento y Evaluaciones

Después de haber modelado hemos sacado la importancia que da el modelo a las variables en el dataframe. La más importante, con clara distancia de las demás, es la variable "apache_4a_hospital_death_prob", la cual como se comenta en el anexo de variables es un dato sacado de un puntuaje del propio hospital. Es decir, proveniene de un análisis de probabilidad de posible muerte, lo cual se encuentra el sentido de su peso en este dataset. Observando otras variables podemos ver "d1_spo2_min" referido a la saturación de oxigeno (oxígeno en sangre) mínima del paciente en la unidad y "d1_heartrate_min" referido al ritmo cardiáco mínimo del paiciente, ambos señal de un grave problema médico si los niveles no son regulares o no se encuentran en la normalidad.

Hemos logrado apuntalar la precisión de la supervivencia, donde ha alcanzado el 97% de precisión. De esta forma estaríamos muy cerca de lograr un modelo de supervivencia óptimo, el cual el Falso Negativo fuese muy difícil que apareciera. Como hemos comentado antes, la sensibilidad del fallo con un Falso Negativo era muy muy delicada en el ámbito de salud, en especial si hablamos de supervivencia, ya que esta target crítica distribuiría capacitación sanitaria y la distribución de los recursos. Por ello, habría que tener especial cuidado de no desatender a estos Falsos Negativos, ya que supondría el fallecimiento de dichos pacientes sin haber recibido la atención necesaria.Sobre el recall se ha logrado equilibrar bastante con el balanceo, siendo antes muy posible identificar a los supervivientes pero con muchas dificultades respecto a los pacientes que fallecerán. Ahora podemos observar que en un 0.80 y 0.72 apuntalan el recall haciendo que se puedan identificar más casos con más efectividad. Dicho esto, la f1-score que combina precisión y recall mantiene en un buen porcentaje a los supervivientes y ve necesario seguir mejorando en el apartado de la precisión con los fallecimientos. Por último, debido al desbalanceo de clases no hemos usado el accuracy, ya que puede llevar a engaño, ya de primeras no es una métrica demasiado buena porque no es exacta, pero ya con desbalanceo entramos e una problemática si nos fijásemos en dicha métrica. Obviamente, será mucho mayor el número de supervivientes que de fallecimientos, por lo tanto el resultado que nos devolviese no sería certero.

Aplicamos nuestro modelo sobre el dataset de test para ver resultados y conclusiones

Paciente con más probabilidad de fallecer

Paciente con menos probabilidad de fallecer

Conclusiones

Respecto a los dos pacientes requeridos como con más probabilidad de fallecer y con menos podemos ver: una gran diferencia en la variable apache_4a que es el score de APACHE III respecto a la mortandad. El paciente 1 con una prob de morir del 84% le dan un 75% de probabilidad de morir en dicho score, en cambio el paciente 2 se le da un 0.

Respecto a la variable edad varia mucho, el 1 tiene 61 años y el paciente 2 tiene 23 años, una diferencia muy importante a la hora de determinar posibilidades de supervivencia o no. A su vez, la frecuencia respiratoria del paciente 1 es mayor, de ehcho quintuplica la del paciente 2.

Según el BMI del paciente 1 está obeso, superando los baremos en varios punto, el paciente 2 está en un peso normal. Respecto a la glucosa (los varemos normales están entre 70 y 100, el paciente 1 mantiene la mínima en 33, muy por debajo de lo normal, el paciente 2 en 87.

Sin duda alguna hay diferencias claves que suponen que la probabilidad de supervivencia sea mayor respecto a cualquier problema de salud. Algo que se puede entrar más en detalle a esclarecer dichos hechos.